import axios from 'axios'
import storejs from 'store'
import STORECONST from '../../storeConst'
import router from '../../../router'
import hdLog from './hdLog'
import store from '@/store'
import {AJAXLOADING} from '@/store/mutation-types'
import { Toast } from 'vue-ydui/dist/lib.rem/dialog';

const hdAjax = (options) => {
  let option = {
    // 请求的接口，在请求的时候，如axios.get(url,config);这里的url会覆盖掉config中的url
    url: '',
    // 请求方法同上
    method: 'get', // default
    // 基础url前缀
    baseURL: '',
    // 请求之前的数据
    transformRequest: [function (data) {
      // 这里可以在发送请求之前对请求数据做处理，比如form-data格式化等，这里可以使用开头引入的Qs（这个模块在安装axios的时候就已经安装了，不需要另外安装）
      // data = Qs.stringify({});
      return data
    }],
    // 请求之后的数据
    transformResponse: [function (data) {
      // 这里提前处理返回的数据
      return data
    }],
    // 请求头信息
    headers: {},
    // parameter参数
    params: {},
    // post参数，使用axios.post(url,{},config);如果没有额外的也必须要用一个空对象，否则会报错
    data: {},
    // 设置超时时间(毫秒)
    timeout: 5000,
    // 返回数据类型
    responseType: 'json' // default
  }

  /* 显示加载中动画 */
  store.commit(AJAXLOADING, true)
  /**
   * 调用网络请求
   */
  // function funErr () {
  //   return false
  // }
  if (options !== null && options !== undefined && options instanceof Object) {
    // 如果有用户信息将用户信息放入 headers
    let userinfo = storejs.get(STORECONST.USERINFO)
    if (userinfo && userinfo.userId) {
      option.headers['juyou-ticket'] = userinfo.accessTicket
    }
    options.php = options.php ? options.php : false
    // 判断请求类型post情况需要JSON.stringify转码给后台
    if (!options.method || options.method.toLowerCase() === 'get') {
      options.params = options.data
    } else {
      // 如果是正常类型请求, 将进行转码处理, 通常FormData类型为文件上传类型
      if (!(options.data instanceof FormData) && options.php === false) {
        options.data = JSON.stringify(options.data)
      }
    }
    /**
     * 合并用户参数
     * Object.assign(target, source1, source2)
     */
    Object.assign(option, options)
    // 执行请求
    axios(option).then(function (resultData) {
      /* 隐藏加载中动画 */
      store.commit(AJAXLOADING, false)
      // 判断是否通讯正常
      if (resultData.status === 200) {
        // resultData 为 axios 返回结果集,需要处理后才能返回
        let rsd = resultData.data
        // 平台接口返回
        if (rsd) {
          if (rsd.errcode !== undefined) {
            // 0:正常返回数据 10010:没有数据返回,数据为空 10003: 查询不到数据 [1502441286745-9525777]
            if (rsd.errcode === 0 || rsd.errcode === 10010 || rsd.errcode === 9999 || rsd.errcode === 10003) {
              let rs = rsd
              let logText = ''
              // 无数据的情况,模拟接口返回数据,错误码统一为0
              if (resultData.errcode === 10003 || rsd.errcode === 10010) {
                let simdata = {'errcode': 0, 'errmsg': resultData.errmsg}
                rs = simdata
                logText = ': 无数据'
              }
              hdLog({msg: '接口正常' + logText + '', option: option, rs: rs})
              if (option.success && typeof (option.success) === 'function') {
                return option.success(rs)
              }
            } else if (rsd.errcode === 1001) {
              hdLog({msg: '未登录', option: option})
              // 未登录跳转到登录页面,并且传递返回页面地址
              router.push({path: '/Login', query: {redirect: router.currentRoute.fullPath}})
            } else if (rsd.errcode === 1002) {
              hdLog({msg: '接口无权限', option: option, rs: rsd})
              Toast({
                mes: `[接口无权限]${option.url}`,
                timeout: 1500,
                icon: 'error'
              })
              return
            } else if (rsd.errcode === 1010) {
              hdLog({msg: '接口rpc error', option: option, rs: rsd})
              Toast({
                mes: `[rpc error]${option.url}<br/>${rsd.errmsg}`,
                timeout: 1500,
                icon: 'error'
              })
              return
            } if (rsd.errcode === 10002) {
              hdLog({msg: '接口rpc error', option: option, rs: rsd})
              Toast({
                mes: `[api error]${rsd.errmsg}`,
                timeout: 1500,
                icon: 'error'
              })
              return
            } else {
              hdLog({msg: '接口异常', option: option})
              if (option.fail && typeof (option.fail) === 'function') {
                return option.fail(rsd)
              }
            }
          } else if (rsd.status !== undefined) { // PHP 接口
            if (rsd.status === 120) { // 未登录
              hdLog({msg: '未登录', option: option})
              // 未登录跳转到登录页面,并且传递返回页面地址
              router.push({path: '/Login', query: {redirect: router.currentRoute.fullPath}})
            } else {
              hdLog({msg: 'PHP接口正常', option: option, rs: rsd})
              if (option.success && typeof (option.success) === 'function') {
                return option.success(rsd)
              }
            }
          } else {
            hdLog({msg: 'resultData结果异常', option: option, rs: rsd})
          }
        } else {
          // 如果是上传文件,包装返回值,其他场景暂时忽略
          if ((option.data instanceof FormData)) {
            let simdata = {'errcode': 0, 'errmsg': 'FormData格式数据请求成功'}
            if (option.success && typeof (option.success) === 'function') {
              return option.success(simdata)
            }
          }
          hdLog({msg: '接口通讯正常,但未获取到异步请求 data 数据', option: option})
        }
      } else {
        // 返回状态非200情况
        hdLog({msg: '接口通讯异常', option: option, rs: resultData})
      }
    }).catch(function (error) {
      /* 隐藏加载中动画 */
      store.commit(AJAXLOADING, false)
      Toast({
        mes: `[系统错误]${error.message}`,
        timeout: 1500,
        icon: 'error'
      })
      if (error.code === 'ECONNABORTED') {
        hdLog({msg: '请求超时'})
      } else {
        hdLog({msg: error.message, leave: 'ERROR'})
      }
    })
  } else {
    /* 隐藏加载中动画 */
    store.commit(AJAXLOADING, false)
    hdLog({msg: '数据异常,hdajax参数为空'})
    Toast({
      mes: `[数据异常]hdajax参数为空`,
      timeout: 1500,
      icon: 'error'
    })
  }
}

export default hdAjax
